为什么选择NestJS
很多同学会问:为什么不使用那些轻量的HTTP Server框架(如Koa、Express),而要选择NestJS这个看似"很重"的框架?
轻量框架的局限
Koa和Express虽然生态丰富,但它们的核心只提供了HTTP服务能力。要构建一个通用的后端框架,还需要手动集成大量模块:数据库连接、权限控制、日志服务、数据校验等。与其手动组装,不如直接使用一个已经把这些通用功能整合好的框架。
NestJS"看起来重"的三个原因
| 原因 | 说明 |
|---|---|
| TypeScript驱动 | NestJS完全使用TypeScript编写,不熟悉TS的同学会觉得官方文档和示例难以阅读 |
| Angular/Spring概念 | 借鉴了Angular的模块化设计和Java Spring的分层架构,没有后端经验的同学会觉得概念复杂 |
| 缺少趁手的初始化框架 | 虽然官方提供了CLI工具,但对前置概念不熟悉会阻碍快速进入业务开发 |
通用后端框架的设计思路
通用后端框架的目标是将NestJS生态中成熟、通用的公共功能提炼出来,形成一个开箱即用的框架骨架。
服务端核心功能模块
从用户、服务端、数据库三者的关系出发,服务端需要考虑以下核心功能:
用户请求 → [数据校验] → [权限控制] → 服务端 → [数据库连接] → 数据库
↓ ↓ ↓
拦截非法请求 控制数据访问 [日志服务] 记录所有操作
text
1. 数据校验
用户请求到达服务端的第一道关卡。非法请求(参数错误、格式不对)在这一层被拦截,不会到达数据库层面。NestJS中通常使用 class-validator 和 class-transformer 配合DTO(Data Transfer Object)实现。
// dto/create-user.dto.ts
import { IsString, IsEmail, MinLength } from 'class-validator';
export class CreateUserDto {
@IsString()
@MinLength(2)
username: string;
@IsEmail()
email: string;
@IsString()
@MinLength(6)
password: string;
}
typescript
2. 数据库连接
处理数据校验通过后的数据持久化。NestJS通过 @nestjs/typeorm 或 @nestjs/mongoose 提供统一的数据库访问层,支持MySQL、PostgreSQL、MongoDB等主流数据库。
3. 权限控制
控制用户能访问哪些接口、能操作哪些数据。包括接口级别的访问控制(RBAC/ABAC)和数据级别的行级权限。
4. 日志服务
记录所有用户请求、数据库响应和服务端运行状态。日志服务不仅仅是为了统计,更重要的是用于问题排查、数据回滚和安全审计。NestJS内置了Logger模块,也支持集成Winston、Pino等第三方日志库。
通用框架功能模块清单
| 模块 | 功能 | NestJS生态方案 |
|---|---|---|
| 数据校验 | 请求参数校验 | class-validator + ValidationPipe |
| 数据库 | 数据持久化 | TypeORM / Mongoose / Prisma |
| 权限控制 | 访问控制 | @nestjs/passport + JWT/CASL |
| 日志服务 | 操作记录 | @nestjs/common Logger / Winston |
| 配置管理 | 环境变量 | @nestjs/config |
| 缓存 | 性能优化 | @nestjs/cache-manager |
| 文件上传 | 资源管理 | Multer middleware |
| API文档 | 接口文档 | @nestjs/swagger |
从轻量到框架的演进路径
对于前端同学来说,学习NestJS不需要一步到位理解所有概念。推荐的学习路径:
- 先用CLI创建项目:熟悉项目结构和基本概念
- 实现一个简单的CRUD:理解Controller → Service → Entity的分层
- 加入数据校验和权限:理解Middleware/Pipe/Guard的执行管道
- 集成数据库和缓存:理解Module的依赖注入
- 添加日志和监控:理解NestJS的生命周期钩子
这种渐进式学习方式可以避免一开始被大量概念压垮,而是在实际开发中逐步深入理解。
↑